package code19_jdk8.stream;

import java.util.Optional;

public class TestTerminate02 {

	public static void main(String[] args) {
		//f1();
		
		//f2();
		
		//f3();
		
		f4();
	}

	private static void f4() {
		// max: 返回最大的结果
		// 找最高工资
		Optional<Double> max = Emp.getData().stream()
		.map(Emp::getSal)// 取出工资
		// 参数1 - 参数2, 会返回正常的 最大结果
		//.max( (s1, s2) -> Double.compare(s1, s2) )
		.max( Double::compare )// 简化
		;
		System.out.println("max:"+max);
		
		Optional<Double> max2 = Emp.getData().stream()
		.map(Emp::getSal)// 取出工资
		// 参数2 - 参数1, 会返回 正常操作的 最小结果
		.max( (s1, s2) -> Double.compare(s2, s1) )
		;
		System.out.println("max2:"+max2);
		
		System.out.println("----------------");
		// 找出最低的工资
		Optional<Double> min = Emp.getData().stream()
		.map(Emp::getSal)// 取出工资
		// 参数1 - 参数2, 会返回正常的 最小结果
		.min( Double::compare )
		;
		
		System.out.println("min:" + min);
	}

	private static void f3() {
		// count() 统计流中元素的个数
		// 统计去重后, 员工的数量
		long count = Emp.getData().stream()
		.distinct()
		.count();
		System.out.println("count:" + count);
	}

	private static void f2() {
		// findAny 找任意一个.
		// stream() 串行流, 每次找到的都是相同的
		// parallelStream() 并行流, 每次找到的对象 不一定相同
		
		// 找一个空闲的员工
		Optional<Emp> findAny1 = Emp.getData().stream()
		.filter( e -> Emp.State.FREE.equals(e.getState()) )
		.findAny();
		
		System.out.println("串行流:" + findAny1);
		
		Optional<Emp> findAny2 = Emp.getData().parallelStream()
		.filter( e -> Emp.State.FREE.equals(e.getState()) )
		.findAny();
		System.out.println("并行流:" + findAny2);
	}

	private static void f1() {
		// findFirst 取出流中的第一个元素，会把结果封装成 Optional
		Optional<Emp> first = Emp.getData().stream()
		.sorted( (e1, e2) -> Double.compare(e1.getSal(), e2.getSal()) )
		.findFirst();
		if (first.isPresent()) {
			Emp emp = first.get();
			System.out.println(emp);
		}
	}
	
}
